package practice.aop.spring.annot;

import org.aspectj.lang.annotation.After;
import org.aspectj.lang.annotation.AfterReturning;
import org.aspectj.lang.annotation.AfterThrowing;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.springframework.core.annotation.Order;

//자동으로  Advice  적용
@Aspect
@Order(1)
public class LoggingAspect {
	// Before Advice으로 대상 객체의 메서드 실행 이전에 적용할 기능 구현
	@Before("PublicPointcut.publicMethod()")
	public void before() {
		System.out.println("메서드 실행 전 전처리 수행");
	}

	// After Returning Advice으로 대상 객체의 메서드가 정상적으로 실행된 이후에 적용할 기능 구현
	@AfterReturning(pointcut = "min.chapter.five.annot.PublicPointcut.publicMethod()	", returning = "ret")
	public void afterReturning(Object ret) {
		System.out.println("메서드 실행 후 후처리 수행, 리턴값=" + ret);
	}

	// After Throwing Advice으로 대상 객체의 메서드가 예외를 발생시킨 경우에 적용할 기능 구현
	@AfterThrowing(pointcut = "min.chapter.five.annot.PublicPointcut.publicMethod()", throwing = "ex")
	public void afterThrowing(Throwable ex) {
		System.out.println("메서드 실행 중 예외 발생, 예외=" + ex.getMessage());
	}

	// After Advice으로 예외에 상관없이 적용할 기능 구현
	@After("min.chapter.five.annot.PublicPointcut.publicMethod()")
	public void afterFinally() {
		System.out.println("[LA] 메서드 실행 완료");
	}

}
